

package cn.shengchao.examstar.distribute.infrastrure.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.shengchao.examstar.distribute.convert.DistributeUserInviteConvertor;
import cn.shengchao.examstar.distribute.infrastrure.mapper.DistributeNodeInfoMapper;
import cn.shengchao.examstar.distribute.infrastrure.mapper.DistributeUserInviteMapper;
import cn.shengchao.examstar.distribute.infrastrure.po.DistributeUserInvite;
import cn.shengchao.examstar.distribute.infrastrure.service.DistributeUserInviteService;
import cn.shengchao.examstar.rpc.base.PageResult;
import cn.shengchao.examstar.rpc.distribute.dto.UserInviteDto;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeDataStatusEnum;
import cn.shengchao.examstar.rpc.uddsys.req.DistributeUserInvitePageQuery;
import cn.shengchao.examstar.rpc.uddsys.req.DistributeUserInviteSaveDto;
import cn.shengchao.examstar.rpc.uddsys.resp.DistributeUserInviteVo;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import top.continew.starter.core.exception.BaseException;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class DistributeUserInviteServiceImpl extends ServiceImpl<DistributeUserInviteMapper, DistributeUserInvite> implements DistributeUserInviteService {
    private final DistributeNodeInfoMapper distributeNodeInfoMapper;
    @Override
    public List<UserInviteDto> selectUserInviteRecords(List<Long> userIds) {
        return baseMapper.selectUserInviteRecordsForUsers(userIds);
    }

    @Transactional
    @Override
    public void saveInviteRecord(UserInviteDto userInviteDto) {
        List<DistributeUserInvite> distributeUserInvites = baseMapper.selectList(Wrappers
                .lambdaQuery(DistributeUserInvite.class)
                        .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus())
                .in(DistributeUserInvite::getUserId, userInviteDto.getUserId()));
        if (CollUtil.isNotEmpty(distributeUserInvites)) {
            update(Wrappers.lambdaUpdate(DistributeUserInvite.class)
                    .eq(DistributeUserInvite::getUserId, userInviteDto.getUserId())
                    .set(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_HIS.getStatus())
            );
        }
        DistributeUserInvite distributeUserInvite = DistributeUserInviteConvertor
            .convertNewEntityFromDto(userInviteDto);
        save(distributeUserInvite);
    }

    /**
     * 获取邀请记录
     *
     * @param userInviterIds 邀请人
     * @return List<DistributeUserInvite>
     */
    @Override
    public Map<Long, List<DistributeUserInvite>> getInviteRecord(List<Long> userInviterIds, Date start, Date end) {
        List<DistributeUserInvite> distributeUserInvites = baseMapper.selectList(Wrappers
            .lambdaQuery(DistributeUserInvite.class)
            .in(DistributeUserInvite::getInviteUserId, userInviterIds)
            .ge(start != null, DistributeUserInvite::getCreateTime, start)
            .le(end != null, DistributeUserInvite::getCreateTime, end));
        return distributeUserInvites.stream().collect(Collectors.groupingBy(DistributeUserInvite::getInviteUserId));
    }

    @Override
    public List<DistributeUserInvite> getInviteRecordListByDistributeUserId(List<Long> distributeUserIds) {
        if (distributeUserIds.isEmpty()) {
            return new ArrayList<>();
        }
        return baseMapper.selectList(Wrappers.lambdaQuery(DistributeUserInvite.class)
            .in(DistributeUserInvite::getInviteUserId, distributeUserIds)
                .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));
    }

    @Override
    public List<DistributeUserInvite> getInviteRecordListByDistributeUserIdsAndRole(List<Long> userIds, String distributeRoleCode,Date start,Date end) {
        if (CollUtil.isNotEmpty(userIds)) {
            return baseMapper.selectInviteRecordListByDistributeUserIdsAndRole(userIds, distributeRoleCode, start, end);
        }else {
            return List.of();
        }
    }

    @Transactional
    @Override
    public void batchUpdateUserInviteRecord(Long userId) {
        //查询出该用户邀请记录
        List<DistributeUserInvite> originDistributeUserInviteList = list(Wrappers
            .lambdaQuery(DistributeUserInvite.class)
            .eq(DistributeUserInvite::getInviteUserId, userId)
            .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));
        List<DistributeUserInvite> newDistributeUserInviteList = new ArrayList<>();
        for (DistributeUserInvite originDistributeUserInvite : originDistributeUserInviteList) {
            DistributeUserInvite distributeUserInvite1 = new DistributeUserInvite();
            BeanUtil.copyProperties(originDistributeUserInvite, distributeUserInvite1);
            //原来的改为历史记录
            originDistributeUserInvite.setDataStatus(DistributeDataStatusEnum.STATUS_HIS.getStatus());
            distributeUserInvite1.setId(null);
            //收益人分配改为邀请人
            distributeUserInvite1.setDistributeUserId(userId);
            //改为历史记录
            distributeUserInvite1.setDataStatus(DistributeDataStatusEnum.STATUS_CURT.getStatus());
            newDistributeUserInviteList.add(distributeUserInvite1);
        }
        updateBatchById(originDistributeUserInviteList);
        saveBatch(newDistributeUserInviteList);
    }

    @Override
    public void batchUpdateUserInviteRecordForJms(Long userId, Long distributeUserId) {
        //查询出该用户邀请记录
        List<DistributeUserInvite> originDistributeUserInviteList = list(Wrappers
            .lambdaQuery(DistributeUserInvite.class)
            .eq(DistributeUserInvite::getInviteUserId, userId)
            .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));
        List<DistributeUserInvite> newDistributeUserInviteList = new ArrayList<>();
        for (DistributeUserInvite originDistributeUserInvite : originDistributeUserInviteList) {
            originDistributeUserInvite.setDataStatus(DistributeDataStatusEnum.STATUS_HIS.getStatus());
            DistributeUserInvite distributeUserInvite1 = new DistributeUserInvite();
            //原来的改为历史记录
            distributeUserInvite1.setId(null);
            distributeUserInvite1.setUserId(originDistributeUserInvite.getUserId());
            //收益人分配改为邀请人
            distributeUserInvite1.setInviteUserId(distributeUserId);
            //收益人分配改为邀请人
            distributeUserInvite1.setDistributeUserId(distributeUserId);
            //改为历史记录
            distributeUserInvite1.setDataStatus(DistributeDataStatusEnum.STATUS_CURT.getStatus());
            newDistributeUserInviteList.add(distributeUserInvite1);
        }
        updateBatchById(originDistributeUserInviteList);
        saveBatch(newDistributeUserInviteList);
    }

    @Override
    public PageResult<DistributeUserInviteVo> queryDistributeUserInvitePage(DistributeUserInvitePageQuery distributeUserInvitePageQuery) {
        Page<DistributeUserInviteVo> page =PageHelper.startPage(distributeUserInvitePageQuery.getPage(), distributeUserInvitePageQuery.getSize());
        List<DistributeUserInviteVo> distributeUserInviteVoList = baseMapper.queryDistributeUserInvitePage(distributeUserInvitePageQuery);
        return PageResult.of(page.getTotal(), distributeUserInviteVoList);
    }
    @Transactional
    @Override
    public void updateWxInviteRecord(DistributeUserInviteSaveDto userInviteSaveDto) {
        List<DistributeUserInvite> distributeUserInvites= baseMapper.selectList(Wrappers.lambdaQuery(DistributeUserInvite.class)
                .eq(DistributeUserInvite::getUserId, userInviteSaveDto.getUserId())
                .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));

        DistributeUserInvite distributeUserInvite1 = new DistributeUserInvite();
        distributeUserInvite1.setUserId(userInviteSaveDto.getUserId());
        distributeUserInvite1.setInviteUserId(userInviteSaveDto.getInviteUserId());
        if (CollUtil.isNotEmpty(distributeUserInvites)){
            distributeUserInvites.forEach(distributeUserInvite -> {
                distributeUserInvite.setDataStatus(DistributeDataStatusEnum.STATUS_HIS.getStatus());
                baseMapper.updateById(distributeUserInvite);
            });
        }

        if (distributeUserInvite1.getInviteUserId()==null){
            throw new BaseException("执行更新邀请用户时邀请用户为空");
        }
        distributeUserInvite1.setDistributeUserId(userInviteSaveDto.getDistributeUserId());
        distributeUserInvite1.setDataStatus(DistributeDataStatusEnum.STATUS_CURT.getStatus());
        distributeUserInvite1.setId(null);
        baseMapper.insert(distributeUserInvite1);
    }


    @Transactional
    @Override
    public void batchUpdateUserInviteRecordForJmsYg(Long userId, UserInviteDto userInviteDto2) {
        //查询出该用户邀请记录
        List<DistributeUserInvite> originDistributeUserInviteList = list(Wrappers
                .lambdaQuery(DistributeUserInvite.class)
                .eq(DistributeUserInvite::getInviteUserId, userId)
                .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));
        List<DistributeUserInvite> newDistributeUserInviteList = new ArrayList<>();
        if (CollUtil.isNotEmpty(originDistributeUserInviteList)){
            List<Long> userIds=originDistributeUserInviteList.stream().map(DistributeUserInvite::getUserId).distinct().toList();
            for (Long uid : userIds) {
                DistributeUserInvite distributeUserInvite1 = new DistributeUserInvite();
                //原来的改为历史记录
                distributeUserInvite1.setId(null);
                distributeUserInvite1.setUserId(uid);
                //收益人分配改为邀请人
                distributeUserInvite1.setInviteUserId(userInviteDto2.getInviteUserId());
                //收益人分配改为邀请人
                distributeUserInvite1.setDistributeUserId(userInviteDto2.getDistributeUserId());
                //改为历史记录
                distributeUserInvite1.setDataStatus(DistributeDataStatusEnum.STATUS_CURT.getStatus());
                newDistributeUserInviteList.add(distributeUserInvite1);
            }
            update(Wrappers.lambdaUpdate(DistributeUserInvite.class)
                    .eq(DistributeUserInvite::getInviteUserId, userId)
                    .eq(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus())
                    .set(DistributeUserInvite::getDataStatus, DistributeDataStatusEnum.STATUS_HIS.getStatus())
            );
            saveBatch(newDistributeUserInviteList);
        }

    }
}
